// Tetromino.cpp
#include "Tetromino.h"
#include <cstdlib> // 用于 rand()
#include <ctime>   // 用于 time()
#include <iostream>
#include <chrono>
Tetromino::Tetromino() : x(8), y(0){
    srand(static_cast<unsigned>(time(0))); // 初始化随机数种子

    int shapeIndex = rand() % 7; // 随机选择一个形状
    switch (shapeIndex) {
    case 0: // I 形
        shape = { {1, 1, 1, 1} };
        color = RGB(0, 255, 255); // 青色
        break;
    case 1: // O 形
        shape = { {1, 1}, {1, 1} };
        color = RGB(255, 255, 0); // 黄色
        break;
    case 2: // S 形
        shape = { {0, 1, 1}, {1, 1, 0} };
        color = RGB(0, 255, 0); // 绿色
        break;
    case 3: // Z 形
        shape = { {1, 1, 0}, {0, 1, 1} };
        color = RGB(255, 0, 0); // 红色
        break;
    case 4: // L 形
        shape = { {1, 0, 0}, {1, 1, 1} };
        color = RGB(255, 165, 0); // 橙色
        break;
    case 5: // J 形
        shape = { {0, 0, 1}, {1, 1, 1} };
        color = RGB(0, 0, 255); // 蓝色
        break;
    case 6: // T 形
        shape = { {0, 1, 0}, {1, 1, 1} };
        color = RGB(128, 0, 128); // 紫色
        break;
        //    } 
        //    case 0: // I 形
        //        shape = { {1, 1, 1, 1, 1} };
        //        color = RGB(0, 255, 255); // 青色
        //        break;
        //    case 1: // O 形
        //        shape = { {1, 1}, {1, 1}, {0, 1} };
        //        color = RGB(255, 255, 0); // 黄色
        //        break;
        //    case 2: // S 形
        //        shape = { {0, 1, 1, 1}, {1, 1, 0, 0} };
        //        color = RGB(0, 255, 0); // 绿色
        //        break;
        //    case 3: // Z 形
        //        shape = { {1, 1, 1, 0}, {0, 0, 1, 1} };
        //        color = RGB(255, 0, 0); // 红色
        //        break;
        //    case 4: // L 形
        //        shape = { {1, 0, 0, 0}, {1, 1, 1, 1} };
        //        color = RGB(255, 165, 0); // 橙色
        //        break;
        //    case 5: // J 形
        //        shape = { {0, 0, 0, 1}, {1, 1, 1, 1} };
        //        color = RGB(0, 0, 255);// 蓝色
        //        break;
        //    case 6: // T 形
        //        shape = { {0, 1, 0, 0}, {1, 1, 1, 1} };
        //        color = RGB(128, 0, 128); // 紫色
        //        break;
        //    case 7:
        //        shape = { {0, 0, 1, 0}, {1, 1, 1, 1} };
        //        color = RGB(165, 42, 42);//棕色
        //}
    }
    int linesCleared = ClearFullLines(); // 获取消去的行数
    UpdateScore(linesCleared); // 更新得分
}
void Tetromino::UpdateScore(int linesCleared) {
    switch (linesCleared) {
        case 1: score += 100; break;
        case 2: score += 300; break;
        case 3: score += 500;  break;
        case 4: score += 1000; break; // 每消去一行得100分
        default:break;
    }

}
void Tetromino::Rotate() {
    std::vector<std::vector<int>> newShape(shape[0].size(), std::vector<int>(shape.size()));
    for (int i = 0; i < shape.size(); ++i) {
        for (int j = 0; j < shape[i].size(); ++j) {
            newShape[j][shape.size() - 1 - i] = shape[i][j]; // 逆时针旋转
        }
    }
    shape = newShape;
}

int Tetromino::ClearFullLines() {
    int linesCleared = 0; // 初始化消去的行数

    for (int row = 0; row < GRID_HEIGHT; ++row) {
        bool full = true;
        for (int col = 0; col < GRID_WIDTH; ++col) {
            if (grid[row][col] == 0) {
                full = false;
                break;
            }
        }

        if (full) {
            linesCleared++; // 计数消去的行
            // 移除满行
            for (int r = row; r > 0; --r) {
                for (int c = 0; c < GRID_WIDTH; ++c) {
                    grid[r][c] = grid[r - 1][c]; // 将上面的行下移
                    colors[r][c] = colors[r - 1][c]; // 更新颜色
                }
            }
            // 清空顶部行
            for (int c = 0; c < GRID_WIDTH; ++c) {
                grid[0][c] = 0;
                colors[0][c] = RGB(255, 255, 255); // 设置为白色
            }
        }
    }

    return linesCleared; // 返回消去的行数
}


void Tetromino::Move(int dx, int dy) {
    if (isPaused) return; // 如果暂停，则不执行移动

    int newX = x + dx;
    int newY = y + dy;
    COLORREF currentColor = color;

    // 检查左右边界
    if (newX >= 0 && newX + shape[0].size() <= GRID_WIDTH) {
        // 检查是否与固定方块碰撞
        bool canMoveHorizontally = true;
        for (int i = 0; i < shape.size(); ++i) {
            for (int j = 0; j < shape[i].size(); ++j) {
                if (shape[i][j] == 1 && grid[y + i][newX + j] == 1) {
                    canMoveHorizontally = false;
                    break;
                }
            }
            if (!canMoveHorizontally) break;
        }

        if (canMoveHorizontally) {
            x = newX; // 允许左右移动
        } 

        if (!IsAtBottom()) {
            y = newY; // 允许向下移动
        }
        else {
            // 如果已经在底部，记录当前时间
                for (int i = 0; i < shape.size(); ++i) {
                    for (int j = 0; j < shape[i].size(); ++j) {
                        if (shape[i][j] == 1) {
                            grid[y + i][x + j] = 1; // 固定方块
                            colors[y + i][x + j] = currentColor;
                        }
                    }
                }
               

                *this = Tetromino(); // 生成新的方块
            
        }
    }
}

bool Tetromino::IsAtBottom() {
    // 检查方块是否到达底部或碰撞
    if (y + shape.size() >= GRID_HEIGHT) {
        return true;
    }
    // 检查是否与固定方块碰撞
    for (int i = 0; i < shape.size(); ++i) {
        for (int j = 0; j < shape[i].size(); ++j) {
            if (shape[i][j] == 1 && grid[y + i + 1][x + j] == 1 ) {
                return true;
            }
        }
    }
    return false;
}
void Tetromino::DrawGrid(HDC hdc) {
  
    for (int i = 0; i < GRID_HEIGHT; ++i) {
        for (int j = 0; j < GRID_WIDTH; ++j) {
            if (grid[i][j] == 1) {               
                HBRUSH brush = CreateSolidBrush(colors[i][j]); // 使用颜色数组中的颜色
                SelectObject(hdc, brush);
                Rectangle(hdc, j * 20, i * 20, (j + 1) * 20, (i + 1) * 20);
                DeleteObject(brush); // 删除画刷以避免内存泄漏
            }
        }
    }
}



void Tetromino::Draw(HDC hdc) {
    HBRUSH brush = CreateSolidBrush(color); // 创建颜色画刷
    SelectObject(hdc, brush); // 选择画刷

    // 使用 GDI 绘制方块
    for (int i = 0; i < shape.size(); ++i) {
        for (int j = 0; j < shape[i].size(); ++j) {
            if (shape[i][j] == 1) { // 只绘制填充部分
                Rectangle(hdc, (x + j) * 20, (y + i) * 20, (x + j + 1) * 20, (y + i + 1) * 20);
            }
        }
    }

    DeleteObject(brush); // 删除画刷以避免内存泄漏
}

bool Tetromino::IsAtTop() {
    return y < 0; // 判断方块是否碰到顶部
}
